Redacted registry memory mapping in crash tracking#11025
Redacted registry memory mapping in crash tracking#11025
Conversation
1fa1dbd to
b8ae4df
Compare
b7c2fd7 to
c71deb4
Compare
22ef2a7 to
e6f6472
Compare
BenchmarksStartupParameters
See matching parameters
SummaryFound 0 performance improvements and 0 performance regressions! Performance is the same for 60 metrics, 11 unstable metrics. Startup time reports for petclinicgantt
title petclinic - global startup overhead: candidate=1.61.0-SNAPSHOT~e6f6472ef6, baseline=1.61.0-SNAPSHOT~aa7c70f2e7
dateFormat X
axisFormat %s
section tracing
Agent [baseline] (1.056 s) : 0, 1056317
Total [baseline] (11.165 s) : 0, 11165049
Agent [candidate] (1.056 s) : 0, 1056070
Total [candidate] (11.146 s) : 0, 11145596
section appsec
Agent [baseline] (1.253 s) : 0, 1253476
Total [baseline] (11.169 s) : 0, 11168613
Agent [candidate] (1.249 s) : 0, 1248910
Total [candidate] (11.249 s) : 0, 11249439
section iast
Agent [baseline] (1.224 s) : 0, 1224037
Total [baseline] (11.378 s) : 0, 11377829
Agent [candidate] (1.229 s) : 0, 1228971
Total [candidate] (11.333 s) : 0, 11333398
section profiling
Agent [baseline] (1.193 s) : 0, 1192702
Total [baseline] (11.054 s) : 0, 11054043
Agent [candidate] (1.189 s) : 0, 1189110
Total [candidate] (11.018 s) : 0, 11018472
gantt
title petclinic - break down per module: candidate=1.61.0-SNAPSHOT~e6f6472ef6, baseline=1.61.0-SNAPSHOT~aa7c70f2e7
dateFormat X
axisFormat %s
section tracing
crashtracking [baseline] (1.236 ms) : 0, 1236
crashtracking [candidate] (1.234 ms) : 0, 1234
BytebuddyAgent [baseline] (632.614 ms) : 0, 632614
BytebuddyAgent [candidate] (631.508 ms) : 0, 631508
AgentMeter [baseline] (29.366 ms) : 0, 29366
AgentMeter [candidate] (29.334 ms) : 0, 29334
GlobalTracer [baseline] (248.827 ms) : 0, 248827
GlobalTracer [candidate] (248.53 ms) : 0, 248530
AppSec [baseline] (31.913 ms) : 0, 31913
AppSec [candidate] (31.898 ms) : 0, 31898
Debugger [baseline] (60.039 ms) : 0, 60039
Debugger [candidate] (59.833 ms) : 0, 59833
Remote Config [baseline] (607.246 µs) : 0, 607
Remote Config [candidate] (621.259 µs) : 0, 621
Telemetry [baseline] (8.112 ms) : 0, 8112
Telemetry [candidate] (8.072 ms) : 0, 8072
Flare Poller [baseline] (7.427 ms) : 0, 7427
Flare Poller [candidate] (8.982 ms) : 0, 8982
section appsec
crashtracking [baseline] (1.228 ms) : 0, 1228
crashtracking [candidate] (1.236 ms) : 0, 1236
BytebuddyAgent [baseline] (663.301 ms) : 0, 663301
BytebuddyAgent [candidate] (662.316 ms) : 0, 662316
AgentMeter [baseline] (12.101 ms) : 0, 12101
AgentMeter [candidate] (12.012 ms) : 0, 12012
GlobalTracer [baseline] (250.372 ms) : 0, 250372
GlobalTracer [candidate] (248.986 ms) : 0, 248986
IAST [baseline] (24.76 ms) : 0, 24760
IAST [candidate] (24.527 ms) : 0, 24527
AppSec [baseline] (185.392 ms) : 0, 185392
AppSec [candidate] (184.963 ms) : 0, 184963
Debugger [baseline] (66.767 ms) : 0, 66767
Debugger [candidate] (65.977 ms) : 0, 65977
Remote Config [baseline] (628.518 µs) : 0, 629
Remote Config [candidate] (597.696 µs) : 0, 598
Telemetry [baseline] (8.725 ms) : 0, 8725
Telemetry [candidate] (8.424 ms) : 0, 8424
Flare Poller [baseline] (3.706 ms) : 0, 3706
Flare Poller [candidate] (3.493 ms) : 0, 3493
section iast
crashtracking [baseline] (1.221 ms) : 0, 1221
crashtracking [candidate] (1.245 ms) : 0, 1245
BytebuddyAgent [baseline] (801.071 ms) : 0, 801071
BytebuddyAgent [candidate] (804.724 ms) : 0, 804724
AgentMeter [baseline] (11.398 ms) : 0, 11398
AgentMeter [candidate] (11.406 ms) : 0, 11406
GlobalTracer [baseline] (239.31 ms) : 0, 239310
GlobalTracer [candidate] (239.55 ms) : 0, 239550
IAST [baseline] (25.768 ms) : 0, 25768
IAST [candidate] (25.79 ms) : 0, 25790
AppSec [baseline] (32.642 ms) : 0, 32642
AppSec [candidate] (32.742 ms) : 0, 32742
Debugger [baseline] (58.835 ms) : 0, 58835
Debugger [candidate] (59.876 ms) : 0, 59876
Remote Config [baseline] (1.771 ms) : 0, 1771
Remote Config [candidate] (539.897 µs) : 0, 540
Telemetry [baseline] (12.42 ms) : 0, 12420
Telemetry [candidate] (13.343 ms) : 0, 13343
Flare Poller [baseline] (3.448 ms) : 0, 3448
Flare Poller [candidate] (3.456 ms) : 0, 3456
section profiling
crashtracking [baseline] (1.198 ms) : 0, 1198
crashtracking [candidate] (1.193 ms) : 0, 1193
BytebuddyAgent [baseline] (696.026 ms) : 0, 696026
BytebuddyAgent [candidate] (695.666 ms) : 0, 695666
AgentMeter [baseline] (9.145 ms) : 0, 9145
AgentMeter [candidate] (9.209 ms) : 0, 9209
GlobalTracer [baseline] (208.742 ms) : 0, 208742
GlobalTracer [candidate] (207.672 ms) : 0, 207672
AppSec [baseline] (32.668 ms) : 0, 32668
AppSec [candidate] (32.497 ms) : 0, 32497
Debugger [baseline] (65.976 ms) : 0, 65976
Debugger [candidate] (65.378 ms) : 0, 65378
Remote Config [baseline] (583.01 µs) : 0, 583
Remote Config [candidate] (572.238 µs) : 0, 572
Telemetry [baseline] (8.028 ms) : 0, 8028
Telemetry [candidate] (7.766 ms) : 0, 7766
Flare Poller [baseline] (3.655 ms) : 0, 3655
Flare Poller [candidate] (3.589 ms) : 0, 3589
ProfilingAgent [baseline] (94.933 ms) : 0, 94933
ProfilingAgent [candidate] (93.932 ms) : 0, 93932
Profiling [baseline] (95.522 ms) : 0, 95522
Profiling [candidate] (94.494 ms) : 0, 94494
Startup time reports for insecure-bankgantt
title insecure-bank - global startup overhead: candidate=1.61.0-SNAPSHOT~e6f6472ef6, baseline=1.61.0-SNAPSHOT~aa7c70f2e7
dateFormat X
axisFormat %s
section tracing
Agent [baseline] (1.058 s) : 0, 1058286
Total [baseline] (8.878 s) : 0, 8878036
Agent [candidate] (1.063 s) : 0, 1063100
Total [candidate] (8.847 s) : 0, 8847118
section iast
Agent [baseline] (1.225 s) : 0, 1224782
Total [baseline] (9.587 s) : 0, 9586846
Agent [candidate] (1.224 s) : 0, 1224147
Total [candidate] (9.594 s) : 0, 9593762
gantt
title insecure-bank - break down per module: candidate=1.61.0-SNAPSHOT~e6f6472ef6, baseline=1.61.0-SNAPSHOT~aa7c70f2e7
dateFormat X
axisFormat %s
section tracing
crashtracking [baseline] (1.248 ms) : 0, 1248
crashtracking [candidate] (1.236 ms) : 0, 1236
BytebuddyAgent [baseline] (634.063 ms) : 0, 634063
BytebuddyAgent [candidate] (637.639 ms) : 0, 637639
AgentMeter [baseline] (29.42 ms) : 0, 29420
AgentMeter [candidate] (29.671 ms) : 0, 29671
GlobalTracer [baseline] (249.19 ms) : 0, 249190
GlobalTracer [candidate] (250.244 ms) : 0, 250244
AppSec [baseline] (31.982 ms) : 0, 31982
AppSec [candidate] (32.192 ms) : 0, 32192
Debugger [baseline] (59.24 ms) : 0, 59240
Debugger [candidate] (59.614 ms) : 0, 59614
Remote Config [baseline] (606.258 µs) : 0, 606
Remote Config [candidate] (605.682 µs) : 0, 606
Telemetry [baseline] (8.122 ms) : 0, 8122
Telemetry [candidate] (8.139 ms) : 0, 8139
Flare Poller [baseline] (8.235 ms) : 0, 8235
Flare Poller [candidate] (7.343 ms) : 0, 7343
section iast
crashtracking [baseline] (1.229 ms) : 0, 1229
crashtracking [candidate] (1.257 ms) : 0, 1257
BytebuddyAgent [baseline] (801.055 ms) : 0, 801055
BytebuddyAgent [candidate] (801.81 ms) : 0, 801810
AgentMeter [baseline] (11.38 ms) : 0, 11380
AgentMeter [candidate] (11.402 ms) : 0, 11402
GlobalTracer [baseline] (240.2 ms) : 0, 240200
GlobalTracer [candidate] (239.329 ms) : 0, 239329
IAST [baseline] (26.024 ms) : 0, 26024
IAST [candidate] (25.848 ms) : 0, 25848
AppSec [baseline] (33.631 ms) : 0, 33631
AppSec [candidate] (32.516 ms) : 0, 32516
Debugger [baseline] (59.292 ms) : 0, 59292
Debugger [candidate] (59.877 ms) : 0, 59877
Remote Config [baseline] (535.191 µs) : 0, 535
Remote Config [candidate] (1.117 ms) : 0, 1117
Telemetry [baseline] (11.594 ms) : 0, 11594
Telemetry [candidate] (11.243 ms) : 0, 11243
Flare Poller [baseline] (3.495 ms) : 0, 3495
Flare Poller [candidate] (3.475 ms) : 0, 3475
LoadParameters
See matching parameters
SummaryFound 2 performance improvements and 3 performance regressions! Performance is the same for 14 metrics, 17 unstable metrics.
Request duration reports for petclinicgantt
title petclinic - request duration [CI 0.99] : candidate=1.61.0-SNAPSHOT~e6f6472ef6, baseline=1.61.0-SNAPSHOT~aa7c70f2e7
dateFormat X
axisFormat %s
section baseline
no_agent (19.471 ms) : 19271, 19670
. : milestone, 19471,
appsec (19.968 ms) : 19766, 20171
. : milestone, 19968,
code_origins (17.766 ms) : 17593, 17939
. : milestone, 17766,
iast (18.019 ms) : 17837, 18201
. : milestone, 18019,
profiling (18.518 ms) : 18334, 18702
. : milestone, 18518,
tracing (18.167 ms) : 17985, 18349
. : milestone, 18167,
section candidate
no_agent (18.953 ms) : 18760, 19147
. : milestone, 18953,
appsec (18.636 ms) : 18450, 18822
. : milestone, 18636,
code_origins (18.329 ms) : 18149, 18510
. : milestone, 18329,
iast (18.022 ms) : 17841, 18203
. : milestone, 18022,
profiling (18.497 ms) : 18310, 18683
. : milestone, 18497,
tracing (19.184 ms) : 18988, 19379
. : milestone, 19184,
Request duration reports for insecure-bankgantt
title insecure-bank - request duration [CI 0.99] : candidate=1.61.0-SNAPSHOT~e6f6472ef6, baseline=1.61.0-SNAPSHOT~aa7c70f2e7
dateFormat X
axisFormat %s
section baseline
no_agent (1.249 ms) : 1236, 1261
. : milestone, 1249,
iast (3.302 ms) : 3255, 3350
. : milestone, 3302,
iast_FULL (6.008 ms) : 5948, 6068
. : milestone, 6008,
iast_GLOBAL (3.628 ms) : 3564, 3693
. : milestone, 3628,
profiling (2.265 ms) : 2245, 2286
. : milestone, 2265,
tracing (1.965 ms) : 1948, 1982
. : milestone, 1965,
section candidate
no_agent (1.25 ms) : 1237, 1262
. : milestone, 1250,
iast (3.317 ms) : 3267, 3367
. : milestone, 3317,
iast_FULL (5.879 ms) : 5820, 5939
. : milestone, 5879,
iast_GLOBAL (3.624 ms) : 3567, 3681
. : milestone, 3624,
profiling (2.315 ms) : 2292, 2338
. : milestone, 2315,
tracing (1.854 ms) : 1839, 1868
. : milestone, 1854,
DacapoParameters
See matching parameters
SummaryFound 1 performance improvements and 0 performance regressions! Performance is the same for 11 metrics, 0 unstable metrics.
Execution time for tomcatgantt
title tomcat - execution time [CI 0.99] : candidate=1.61.0-SNAPSHOT~e6f6472ef6, baseline=1.61.0-SNAPSHOT~aa7c70f2e7
dateFormat X
axisFormat %s
section baseline
no_agent (1.496 ms) : 1485, 1508
. : milestone, 1496,
appsec (3.842 ms) : 3619, 4065
. : milestone, 3842,
iast (2.29 ms) : 2221, 2359
. : milestone, 2290,
iast_GLOBAL (2.327 ms) : 2258, 2397
. : milestone, 2327,
profiling (2.096 ms) : 2042, 2151
. : milestone, 2096,
tracing (2.085 ms) : 2031, 2138
. : milestone, 2085,
section candidate
no_agent (1.495 ms) : 1483, 1506
. : milestone, 1495,
appsec (2.551 ms) : 2497, 2606
. : milestone, 2551,
iast (2.287 ms) : 2218, 2356
. : milestone, 2287,
iast_GLOBAL (2.33 ms) : 2261, 2400
. : milestone, 2330,
profiling (2.112 ms) : 2057, 2167
. : milestone, 2112,
tracing (2.084 ms) : 2030, 2137
. : milestone, 2084,
Execution time for biojavagantt
title biojava - execution time [CI 0.99] : candidate=1.61.0-SNAPSHOT~e6f6472ef6, baseline=1.61.0-SNAPSHOT~aa7c70f2e7
dateFormat X
axisFormat %s
section baseline
no_agent (15.028 s) : 15028000, 15028000
. : milestone, 15028000,
appsec (14.695 s) : 14695000, 14695000
. : milestone, 14695000,
iast (18.418 s) : 18418000, 18418000
. : milestone, 18418000,
iast_GLOBAL (18.029 s) : 18029000, 18029000
. : milestone, 18029000,
profiling (14.808 s) : 14808000, 14808000
. : milestone, 14808000,
tracing (14.813 s) : 14813000, 14813000
. : milestone, 14813000,
section candidate
no_agent (15.062 s) : 15062000, 15062000
. : milestone, 15062000,
appsec (14.821 s) : 14821000, 14821000
. : milestone, 14821000,
iast (18.241 s) : 18241000, 18241000
. : milestone, 18241000,
iast_GLOBAL (18.003 s) : 18003000, 18003000
. : milestone, 18003000,
profiling (14.969 s) : 14969000, 14969000
. : milestone, 14969000,
tracing (14.909 s) : 14909000, 14909000
. : milestone, 14909000,
|
jbachorik
left a comment
There was a problem hiding this comment.
[Ghost: argus] [Confidence: 95%] [Severity: HIGH]
HotspotCrashLogParser.java — unhandled siginfo: in REGISTER_TO_MEMORY_MAPPING state
Issue:
In the REGISTER_TO_MEMORY_MAPPING state, nextThreadSectionState() explicitly returns null for siginfo: lines (that's intentional — it's not a state transition). The consequence is that the siginfo: line falls into the else if (!line.isEmpty()) branch. Since it doesn't match REGISTER_TO_MEMORY_MAPPING_PARSER (no = sign), but currentRegisterToMemoryMapping is non-empty at that point, computeIfPresent will append the siginfo line as a continuation of the last register's mapping value, silently corrupting that entry.
In practice, siginfo: appears before the Register to memory mapping: section in normal HotSpot crash logs (validated by themis and terminus, who challenged this on those grounds). However, the state machine offers no explicit guard, and the code's contract is not defended.
Chain of thought:
argus originated this finding. janus independently validated after tracing through nextThreadSectionState(). themis and terminus challenged on the basis that siginfo precedes this section in all known HotSpot crash log formats — those challenges were resolved by janus's validate.
Suggested fix:
} else if (!line.isEmpty()) {
+ if (line.startsWith("siginfo:")) {
+ break; // siginfo cannot appear here in normal crash logs; defensive guard
+ }
final Matcher m = REGISTER_TO_MEMORY_MAPPING_PARSER.matcher(line);
jbachorik
left a comment
There was a problem hiding this comment.
[Ghost: terminus] [Confidence: 90%] [Severity: MEDIUM]
CrashUploaderTest.java — testErrorTrackingOmitsRegisterToMemoryMappingByDefault has an incomplete assertion
Issue:
The test asserts that /experimental/register_to_memory_mapping is missing when isExtendedInfoEnabled()=false, but it does not assert that the experimental key itself is absent. This means the test would silently pass even if a serialization bug caused "experimental": {} to be emitted (an empty object instead of the key being absent entirely). In fact, that bug existed in this PR and was caught by the ghost fleet — but this test would not have caught it.
Chain of thought:
terminus (test-quality lens) identified this by inspecting the test against the sample-crash.txt fixture: the file has register-to-memory-mapping data but no ucontext, so the experimental key presence/absence is the right thing to assert.
Suggested fix:
assertThat(event.at("/experimental/register_to_memory_mapping").isMissingNode()).isTrue();
+ // Also verify no empty-object leakage when extendedInfo=false and ucontext=null
+ assertThat(event.at("/experimental").isMissingNode()).isTrue();| boolean incomplete = false; | ||
| String oomMessage = null; | ||
| Map<String, String> registers = null; | ||
| Map<String, String> registers = new LinkedHashMap<>(); |
There was a problem hiding this comment.
Since registers is now always initialized to new LinkedHashMap<>() here, ucontext in the Experimental object will never be null (it may be empty, but not null). Does that mean the payload.experimental.ucontext != null guard in CrashUploader is now superfluous? And should an empty registers map still produce a "ucontext": {} entry in the payload, or should the serializer skip it when the map is empty?
| if (nextThreadSectionState != null) { | ||
| currentRegisterToMemoryMapping = ""; | ||
| state = nextThreadSectionState; | ||
| } else if (!line.isEmpty()) { |
There was a problem hiding this comment.
[Ghost: argus] [Confidence: 95%] [Severity: HIGH]
In the REGISTER_TO_MEMORY_MAPPING state, nextThreadSectionState() returns null for siginfo: lines (intentional — it is not a state transition). This causes the line to fall into this else if (!line.isEmpty()) branch. It won't match REGISTER_TO_MEMORY_MAPPING_PARSER (no =), but if currentRegisterToMemoryMapping is non-empty, computeIfPresent will append the siginfo line as a continuation of the last register's value, silently corrupting it.
In practice siginfo: appears before the Register to memory mapping: section in all known HotSpot crash logs, but a defensive guard would make the ordering assumption explicit.
| } else if (!line.isEmpty()) { | |
| } else if (!line.isEmpty()) { | |
| if (line.startsWith("siginfo:")) { | |
| break; // siginfo cannot appear here in normal crash logs; defensive guard | |
| } | |
| final Matcher m = REGISTER_TO_MEMORY_MAPPING_PARSER.matcher(line); |
| final ObjectMapper mapper = new ObjectMapper(); | ||
| final JsonNode event = mapper.readTree(recordedRequest.getBody().readUtf8()); | ||
|
|
||
| assertThat(event.at("/experimental/register_to_memory_mapping").isMissingNode()).isTrue(); |
There was a problem hiding this comment.
[Ghost: terminus] [Confidence: 90%] [Severity: MEDIUM]
This test asserts that /experimental/register_to_memory_mapping is absent when isExtendedInfoEnabled()=false, but does not assert that the experimental key itself is absent. The test would silently pass even if experimental: {} (an empty object) is emitted — the exact serialization bug the ghost fleet flagged in this PR's uploader code.
| assertThat(event.at("/experimental/register_to_memory_mapping").isMissingNode()).isTrue(); | |
| assertThat(event.at("/experimental/register_to_memory_mapping").isMissingNode()).isTrue(); | |
| assertThat(event.at("/experimental").isMissingNode()).isTrue(); |
| registerToMemoryMapping.put( | ||
| currentRegisterToMemoryMapping, line.substring(line.indexOf('=') + 1)); |
There was a problem hiding this comment.
[Ghost: heimdall] m.end() gives the exact position where the pattern match ended, which is the character after =. Using indexOf('=') would return the wrong position if the key itself contains =, and also diverges from the matcher already in hand.
| registerToMemoryMapping.put( | |
| currentRegisterToMemoryMapping, line.substring(line.indexOf('=') + 1)); | |
| registerToMemoryMapping.put(currentRegisterToMemoryMapping, line.substring(m.end())); |
| private static final Pattern NMETHOD_CLASS = | ||
| Pattern.compile("([A-Za-z][A-Za-z0-9$]*(?:[./][A-Za-z][A-Za-z0-9$]*)+)::"); | ||
|
|
There was a problem hiding this comment.
[Ghost: argus] JVM identifier characters include $ and _ at any position, not just the first. The current pattern misses class names like My_Class or inner classes using $. Same issue applies to DOTTED_CLASS_OOP_REF and IS_AN_OOP below.
| private static final Pattern NMETHOD_CLASS = | |
| Pattern.compile("([A-Za-z][A-Za-z0-9$]*(?:[./][A-Za-z][A-Za-z0-9$]*)+)::"); | |
| private static final Pattern NMETHOD_CLASS = | |
| Pattern.compile("([A-Za-z$_][A-Za-z0-9$_]*(?:[./][A-Za-z$_][A-Za-z0-9$_]*)+)::"); |
| private static final Pattern DOTTED_CLASS_OOP_REF = | ||
| Pattern.compile( | ||
| "\"([A-Za-z][A-Za-z0-9$]*(?:\\.[A-Za-z][A-Za-z0-9$]*)*)\"(\\{0x[0-9a-fA-F]+\\})"); |
There was a problem hiding this comment.
Same $_ identifier fix needed here.
| private static final Pattern DOTTED_CLASS_OOP_REF = | |
| Pattern.compile( | |
| "\"([A-Za-z][A-Za-z0-9$]*(?:\\.[A-Za-z][A-Za-z0-9$]*)*)\"(\\{0x[0-9a-fA-F]+\\})"); | |
| private static final Pattern DOTTED_CLASS_OOP_REF = | |
| Pattern.compile( | |
| "\"([A-Za-z$_][A-Za-z0-9$_]*(?:\\\\.[A-Za-z$_][A-Za-z0-9$_]*)*)\"(\\\\{0x[0-9a-fA-F]+\\\\})"); |
| private static final Pattern IS_AN_OOP = | ||
| Pattern.compile("(is an oop: )([A-Za-z][A-Za-z0-9$]*(?:\\.[A-Za-z][A-Za-z0-9$]*)*)"); |
There was a problem hiding this comment.
Same $_ identifier fix needed here.
| private static final Pattern IS_AN_OOP = | |
| Pattern.compile("(is an oop: )([A-Za-z][A-Za-z0-9$]*(?:\\.[A-Za-z][A-Za-z0-9$]*)*)"); | |
| private static final Pattern IS_AN_OOP = | |
| Pattern.compile("(is an oop: )([A-Za-z$_][A-Za-z0-9$_]*(?:\\\\.[A-Za-z$_][A-Za-z0-9$_]*)*)"); |
| * java.lang.Class} oop) use {@link #redactRegisterToMemoryMapping} which detects the oop type | ||
| * automatically. | ||
| */ | ||
| static String redactDottedClassOopRef(String line) { |
There was a problem hiding this comment.
[Ghost: pythia] redactDottedClassOopRef has no production callers — it's only called from tests directly. A comment makes the intent explicit and prevents a future maintainer from either deleting it (as dead code) or adding a production call that bypasses the class-oop context detection.
| static String redactDottedClassOopRef(String line) { | |
| // @VisibleForTesting — no production callers; used directly in unit tests | |
| static String redactDottedClassOopRef(String line) { |
| public static final boolean CRASH_TRACKING_ENABLE_AUTOCONFIG_DEFAULT = false; | ||
|
|
||
| private CrashTrackingConfig() {} | ||
| } |
There was a problem hiding this comment.
[Ghost: terminus] This removes the private CrashTrackingConfig() {} constructor that prevents instantiation of this constants-only class. The constructor serves as a guard against accidental new CrashTrackingConfig() calls and is idiomatic for utility/constants classes.
| public static final boolean CRASH_TRACKING_ENABLE_AUTOCONFIG_DEFAULT = false; | |
| private CrashTrackingConfig() {} | |
| } | |
| public static final boolean CRASH_TRACKING_ENABLE_AUTOCONFIG_DEFAULT = false; | |
| private CrashTrackingConfig() {} | |
| } |
What Does This Do
This pull request enhances crash tracking by implementing the following features:
Note
This is gated by the same activation property
dd.crashtracking.extended-info.enabledintroduced in #11048.Motivation
To improve debugging capabilities and ensure sensitive information is not exposed during crash reporting.
Additional Notes
The redaction util is specific to the crashtracking because the shape of the data is not exactly the same.